home *** CD-ROM | disk | FTP | other *** search
/ FishMarket 1.0 / FishMarket v1.0.iso / fishies / 001-025 / disk_014 / shell / set.c < prev    next >
C/C++ Source or Header  |  1992-05-06  |  3KB  |  137 lines

  1.  
  2. /*
  3.  * SET.C
  4.  *
  5.  * Matthew Dillon, 24 Feb 1986
  6.  *
  7.  */
  8.  
  9. #include "shell.h"
  10. #define MAXLEVELS 3
  11.  
  12. struct MASTER {
  13.    struct MASTER *next;
  14.    struct MASTER *last;
  15.    char *name;
  16.    char *text;
  17. };
  18.  
  19. static struct MASTER *Mbase[MAXLEVELS];
  20.  
  21. char *
  22. set_var(level, name, str)
  23. register char *name, *str;
  24. {
  25.    register struct MASTER *base = Mbase[level];
  26.    register struct MASTER *last;
  27.  
  28.    while (base != NULL) {
  29.       if (strcmp (name, base->name) == 0) {
  30.          Free (base->text);
  31.          goto gotit;
  32.       }
  33.       last = base;
  34.       base = base->next;
  35.    }
  36.    if (base == Mbase[level]) {
  37.       base = Mbase[level] = (struct MASTER *)malloc (sizeof(struct MASTER));
  38.       base->last = NULL;
  39.    } else {
  40.       base = (struct MASTER *)malloc (sizeof(struct MASTER));
  41.       base->last = last;
  42.       last->next = base;
  43.    }
  44.    base->name = malloc (strlen(name) + 1);
  45.    strcpy (base->name, name);
  46.    base->next = NULL;
  47. gotit:
  48.    base->text = malloc (strlen(str) + 1);
  49.    strcpy (base->text, str);
  50.    return (base->text);
  51. }
  52.  
  53. char *
  54. get_var (level, name)
  55. register char *name;
  56. {
  57.    register struct MASTER *base = Mbase[level];
  58.  
  59.    while (base != NULL) {
  60.       if (strcmp (name, base->name) == 0)
  61.          return (base->text);
  62.       base = base->next;
  63.    }
  64.    return (NULL);
  65. }
  66.  
  67.  
  68. unset_var (level, name)
  69. char *name;
  70. {
  71.    register struct MASTER *base = Mbase[level];
  72.    register struct MASTER *last = NULL;
  73.  
  74.    while (base != NULL) {
  75.       if (strcmp (name, base->name) == 0) {
  76.          if (base != Mbase[level])
  77.             last->next = base->next;
  78.          else
  79.             Mbase[level] = base->next;
  80.          if (base->next != NULL)
  81.             base->next->last = last;
  82.          if (base == Mbase[level])
  83.             Mbase[level] = base->next;
  84.          Free (base->name);
  85.          Free (base->text);
  86.          Free (base);
  87.          return (1);
  88.       }
  89.       last = base;
  90.       base = base->next;
  91.    }
  92.    return (-1);
  93. }
  94.  
  95.  
  96. do_unset_var(str, level)
  97. char *str;
  98. {
  99.    int i;
  100.  
  101.    for (i = 1; i < ac; ++i)
  102.       unset_var (level, av[i]);
  103.    return (1);
  104. }
  105.  
  106. do_set_var(command, level)
  107. char *command;
  108. {
  109.    register struct MASTER *base = Mbase[level];
  110.    register char *str;
  111.  
  112.    if (ac == 1) {
  113.       while (base) {
  114.          printf ("%-10s %s\n", base->name, base->text);
  115.          base = base->next;
  116.       }
  117.       return (1);
  118.    }
  119.    if (ac == 2) {
  120.       str = get_var (level, av[1]);
  121.       if (str)
  122.          printf ("%-10s %s\n", av[1], str);
  123.       else
  124.          set_var (level, av[1], "");
  125.    }
  126.    if (ac > 2)
  127.       set_var (level, av[1], next_word (next_word (command)));
  128.    if (*av[1] == '_') {
  129.       S_histlen = (str = get_var(LEVEL_SET, V_HIST)) ? atoi(str) : 0;
  130.  
  131.       if (S_histlen < 2)   S_histlen = 2;
  132.    }
  133.    return (1);
  134. }
  135.  
  136.  
  137.